package whf.framework.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;

import whf.framework.exception.CreateException;
import whf.framework.exception.FindException;
import whf.framework.exception.NotFoundException;
import whf.framework.exception.RemoveException;
import whf.framework.exception.UpdateException;
import whf.framework.meta.Meta;

/**
 * 基础数据访问对象，提供基于<B>BaseBO</B>为父类的业务对象的基本操作<br>
 * 基本数据操作有CRUD，Finder等
 * @author wanghaifeng
 * @version 1.0
 * 
 */
public interface DAO<T> extends InitializingBean, BeanNameAware {

	/**
	 * @return DAO所对应的元数据
	 */
	public Meta getMeta();

	/**
	 * 删除业务对象
	 * @param bo业务对象
	 * @throws RemoveException 删除失败异常
	 */
	public void remove(T entity) throws RemoveException;

	/**
	 * 创建业务对象
	 * @param bo业务对象
	 * @throws CreateException 创建失败异常
	 */
	public void create(T entity) throws CreateException;

	/**
	 * 修改业务对象
	 * @param bo业务对象
	 * @throws UpdateException 修改失败异常
	 */
	public void update(T entity) throws UpdateException;

	/**
	 * 通过主键查找
	 * @param key 对象主键
	 * @return 业务对象
	 * @throws NotFoundException 没有找到异常
	 */
	public T findByPrimaryKey(Serializable key) throws NotFoundException;

	/**
	 * 使用code（代码）查询对象，对于有code属性的对象使用
	 * @param code
	 * @return
	 * @throws FindException
	 */
	public T findByCode(String code) throws FindException;
	
	/**
	 * @modify wanghaifeng Aug 25, 2006 1:05:26 PM
	 * @return
	 * @throws FindException
	 */
	public List<T> findAll() throws FindException;
	/**
	 * 搜索所有业务对象
	 * @param start排序开始
	 * @param end排序结束
	 * @return 找到的业务对象，第一个是所有对象数目
	 * @throws FindException 查找失败异常
	 */
	public List<T> findAll(int start, int end) throws FindException;

	// find functions, withour rows
	/**
	 * @param query 搜索字符串
	 * @return 对象列表，不包括行数
	 * @throws FindException 查找失败异常
	 */
	public List<T> find(String query) throws FindException;

	/**
	 * @param query 有一个参数的搜索字符串
	 * @param arg 参数
	 * @return 对象列表
	 * @throws FindException 搜索失败异常
	 */
	public List<T> find(String query, Object arg) throws FindException;

	/**
	 * @param query 有多个参数的搜索字符串
	 * @param args 参数列表
	 * @return 对象列表
	 * @throws FindException 查找失败异常
	 */
	public List<T> find(String query, Object[] args) throws FindException;

	// list functions, without rows
	/**
	 * @param queryString 无参数搜索字符串
	 * @param start 开始位置
	 * @param rowsPerPage 行数每页
	 * @return 对象列表
	 */
	public List<T> list(String queryString, int start, int rowsPerPage);

	/**
	 * @param queryString 多参数搜索字符串
	 * @param paramValues 参数值
	 * @param start 开始位置
	 * @param rowsPerPage 行数每页
	 * @return 对象列表
	 */
	public List<T> list(String queryString, Object[] paramValues, int start,
			int rowsPerPage);

	/**
	 * @param queryString 多参数搜索字符串，参数用参数名形式表示，如fieldxxx=?paramname
	 * @param paramNames 参数名列表
	 * @param paramValues 参数值列表，与参数名对应
	 * @param start 开始位置
	 * @param rowsPerPage 行数每页
	 * @return 对象列表
	 */
	public List<T> list(String queryString, String[] paramNames,
			Object[] paramValues, int start, int rowsPerPage);

	/**
	 * 获取对象数目
	 * @param fromAndWhere 带参数搜索字符串
	 * @param params 参数值
	 * @return 满足搜索条件对象数目
	 * @throws FindException 查找异常
	 */
	public int getRowCount(String fromAndWhere, Object[] params)
			throws FindException;
	
	/**
	 * @param conditionString 条件字符串
	 * @return
	 * @throws FindException
	 */
	public int getRowCount(String conditionString) throws FindException;
	
	/**
	 * 通过属性字符串搜索，字符串描述格式为：{property1::=::property1.value};{property2::>=::property2.value};{property3::<=::property3.value...}
	 * 各属性间关系为and,其中::中间::的是一元操作符
	 * @param propertyString
	 * @return
	 * @throws FindException
	 */
	public List<T> query(String queryString) throws FindException;
	
	/**
	 * @modify wanghaifeng Aug 25, 2006 1:04:38 PM
	 * @param queryString
	 * @param start
	 * @param rowsPerPage
	 * @return
	 * @throws FindException
	 */
	public List<T> query(String queryString, int start, int pageSize) throws FindException;

	/**
	 * @modify wanghaifeng Aug 25, 2006 1:06:30 PM
	 * @param queryString
	 * @return
	 * @throws FindException
	 */
	public List<T> queryWithoutLazy(String queryString) throws FindException;
	
	/**
	 * @modify wanghaifeng Aug 25, 2006 1:06:33 PM
	 * @param queryString
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> queryWithoutLazy(String queryString, int start, int pageSize) throws FindException;
	
	/**
	 * @modify wanghaifeng Aug 25, 2006 1:06:35 PM
	 * @param queryString
	 * @return
	 * @throws FindException
	 */
	public int getQueryRowCount(String queryString) throws FindException;
	
	/**
	 * 不支持模糊查询，参照业务对象搜索，搜索条件：
	 * 1、数字等属性如果是0则忽略，其它则作为查询条件
	 * 2、字符串属性空则忽略，其它则作为查询条件
	 * 3、日期属性null忽略，其它作为查询条件
	 * 4、many-to-one属性如果是null忽略，其它查询
	 * 5、collection属性中如果空则忽略，其它则要求每一个对象都in结果中的对象
	 * @modify wanghaifeng Aug 25, 2006 1:06:38 PM
	 * @param properties
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> findByProperties(Map<String, Object> properties, int start, int pageSize) throws FindException;
	
	/**
	 * 同上
	 * @modify wanghaifeng Aug 25, 2006 1:46:34 PM
	 * @param properties
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> findByPropertiesWithoutLazy(Map<String, Object> properties, int start, int pageSize) throws FindException;
	
	//与上面的find方法对应的一组withoutLazy的搜速方法；
	/**
	 * @modify wanghaifeng Aug 25, 2006 1:06:49 PM
	 * @param key
	 * @return
	 * @throws NotFoundException
	 */
	public T findByPrimaryKeyWithoutLazy(Serializable key) throws NotFoundException;
	
	/**
	 * @modify wanghaifeng Aug 25, 2006 1:06:17 PM
	 * @param queryString
	 * @return
	 * @throws FindException
	 */
	public List<T> findWithoutLazy(String queryString) throws FindException;

	/**
	 * @modify wanghaifeng Aug 25, 2006 1:06:17 PM
	 * @param queryString
	 * @param arg
	 * @return
	 * @throws FindException
	 */
	public List<T> findWithoutLazy(String queryString, Object arg) throws FindException;
	
	/**
	 * @modify wanghaifeng Aug 25, 2006 1:06:17 PM
	 * @param queryString
	 * @param params
	 * @return
	 * @throws FindException
	 */
	public List<T> findWithoutLazy(String queryString, Object[] params) throws FindException;
	
	/**
	 * @modify wanghaifeng Aug 25, 2006 1:06:17 PM
	 * @param queryString
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> findWithoutLazy(String queryString, int start, int pageSize) throws FindException;

	/**
	 * @modify wanghaifeng Aug 25, 2006 1:06:17 PM
	 * @param queryString
	 * @param arg
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> findWithoutLazy(String queryString, Object arg, int start, int pageSize) throws FindException;
	
	/**
	 * @modify wanghaifeng Aug 25, 2006 1:06:17 PM
	 * @param queryString
	 * @param params
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> findWithoutLazy(String queryString, Object[] params, int start, int pageSize) throws FindException;
	
	/**
	 * 使用Native sql查询
	 * @modify wanghaifeng Mar 10, 2007 11:56:03 AM
	 * @param sql
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> findBySql(String sql, int start, int pageSize) throws FindException;
	
	/**
	 * @author king
	 * @create 2008-1-21 下午04:35:49
	 * @param queryName
	 * @param params
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> getNamedQueryResult(String queryName, Object[] params, int start, int pageSize) throws FindException;
	
	/**
	 * @author king
	 * @create 2008-1-21 下午04:35:52
	 * @param queryName
	 * @param paramNames
	 * @param params
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> getNamedQueryResult(String queryName, String[] paramNames, Object[] params, int start, int pageSize) throws FindException;
}
